<!DOCTYPE html>
<title>Custom Built-in Elements: define algorithm paths that are reached by customized built-in elements</title>
<link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#customelementsregistry">
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="resources/custom-elements-helpers.js"></script>
<body>
<script>

'use strict';

test_with_window((w) => {
  class A extends w.HTMLButtonElement {}
  let valid_custom_element_names = [
    'a-a',
    'z0-y0',
    'emotion-\u1f60d',
    'math-\u03b1',
    'a.b-c'
  ];
  valid_custom_element_names.forEach((val) => {
    assert_throws_dom('NotSupportedError', w.DOMException, () => {
      w.customElements.define('a-a', A, { extends: val });
    }, `having valid custon element name element interface (${val}) ` +
       'for extends should throw a NotSupportedError')
  });
}, 'Element interface for extends is not valid custom element name should throw error');

test_with_window((w) => {
  class A extends w.HTMLButtonElement {}
  let HTMLUnknownElement_names = [
    'bgsound',
    'blink',
    'isindex',
    'multicol',
    'nextid',
    'spacer',
    42
  ]
  HTMLUnknownElement_names.forEach((val) => {
    assert_throws_dom('NotSupportedError', w.DOMException, () => {
      w.customElements.define('a-a', A, { extends: val });
    }, `having element interface for extends (${val}) undefined in specs` +
       ' should throw a NotSupportedError');
  });
}, 'Element interface for extends not defined in specification should throw error');

test_with_window((w) => {
  class A extends w.HTMLDivElement {}
  w.customElements.define('defined-name', A, { extends: 'div' });
  assert_equals(new A().localName, 'div',
                'localName should be div element interface for extends');
  assert_not_equals(new A().localName, 'defined-name',
                    'localName should not be defined-name');
}, 'localName set to div element interface for extends');

test_with_window((w) => {
  class A extends w.HTMLDataElement {}
  w.customElements.define('defined-name', A, { extends: 'data' });
  assert_equals(new A().localName, 'data',
                'localName should be data element interface for extends');
  assert_not_equals(new A().localName, 'defined-name',
                    'localName should not be defined-name');
}, 'localName set to data element interface for extends');

test_with_window((w) => {
  class A extends w.HTMLTimeElement {}
  w.customElements.define('defined-name', A, { extends: 'time' });
  assert_equals(new A().localName, 'time',
                'localName should be time element interface for extends');
  assert_not_equals(new A().localName, 'defined-name',
                    'localName should not be defined-name');
}, 'localName set to time element interface for extends');
</script>
</body>
